package com.spring.redis.operation.service.impl;

import com.spring.redis.operation.contants.RedisKeyUtils;
import com.spring.redis.operation.service.HashRedisService;
import com.spring.redis.operation.service.base.impl.HashRedisBaseServiceImpl;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * redis 操作hash类型缓存
 *
 * @author zhouyu
 */
@Service
public class HashRedisServiceImpl extends HashRedisBaseServiceImpl implements HashRedisService {


    public HashRedisServiceImpl(RedisTemplate<String, Object> redisTemplate, HashOperations<String, String, Object> hashOperations) {
        super(redisTemplate, hashOperations);
    }

    /**
     * hash类型缓存
     *
     * @param clazz 实体类名称
     * @param field field
     * @param value value
     */
    @Override
    public void put(Class<?> clazz, String key, String field, Object value) {
        super.hSet(RedisKeyUtils.getHashKey(clazz, key), field, value);
    }

    /**
     * hash类型缓存
     *
     * @param className 自定义缓存名称
     * @param field     field
     * @param value     value
     */
    @Override
    public void put(String className, String key, String field, Object value) {
        super.hSet(RedisKeyUtils.getHashKey(className, key), field, value);
    }

    /**
     * hash类型批量缓存
     *
     * @param clazz 实体类名称
     * @param hash  hash
     */
    @Override
    public void putAll(Class<?> clazz, String key, Map<String, Object> hash) {
        super.hMSet(RedisKeyUtils.getHashKey(clazz, key), hash);
    }

    /**
     * hash类型批量缓存
     *
     * @param className 自定义缓存名称
     * @param hash      hash
     */
    @Override
    public void putAll(String className, String key, Map<String, Object> hash) {
        super.hMSet(RedisKeyUtils.getHashKey(className, key), hash);
    }

    /**
     * 获取hash类型缓存
     *
     * @param clazz 实体类名称
     * @param field field
     * @return java.lang.String
     */
    @Override
    public String get(Class<?> clazz, String key, String field) {
        return super.hGet(RedisKeyUtils.getHashKey(clazz, key), field);
    }

    /**
     * 获取hash的所有field和value
     *
     * @param className 自定义缓存名称y
     * @return java.util.Map
     */
    @Override
    public Map<String, Object> getAll(String className, String key) {
        return super.hGetAll(RedisKeyUtils.getHashKey(className, key));
    }

    /**
     * 获取hash的所有field和value
     *
     * @param clazz 自定义缓存名称y
     * @param key   key
     * @return java.util.Map
     */
    @Override
    public Map<String, Object> getAll(Class<?> clazz, String key) {
        return super.hGetAll(RedisKeyUtils.getHashKey(clazz, key));
    }

    /**
     * 批量获取hash类型缓存
     *
     * @param clazz  实体类名称
     * @param fields field
     * @return java.util.List<String>
     */
    @Override
    public List<Object> getAll(Class<?> clazz, String key, String... fields) {
        return super.hMGet(RedisKeyUtils.getHashKey(clazz, key), fields);
    }

    /**
     * 批量获取hash类型缓存
     *
     * @param className 自定义缓存名称
     * @param fields    fields
     * @return java.util.List<String>
     */
    @Override
    public List<Object> getAll(String className, String key, String... fields) {
        return super.hMGet(RedisKeyUtils.getHashKey(className, key), fields);
    }

    /**
     * 获取hash类型缓存
     *
     * @param className 自定义缓存名称
     * @param field     field
     * @return java.lang.String
     */
    @Override
    public String get(String className, String key, String field) {
        return super.hGet(RedisKeyUtils.getHashKey(className, key), field);
    }

    /**
     * 设置hash key过期时间
     *
     * @param clazz   实体类名称
     * @param seconds 过期时间
     */
    @Override
    public void expire(Class<?> clazz, String key, Long seconds) {
        super.expire(RedisKeyUtils.getHashKey(clazz, key), seconds);
    }

    /**
     * 设置hash key过期时间
     *
     * @param className 自定义缓存名称
     * @param seconds   过期时间
     */
    @Override
    public void expire(String className, String key, Long seconds) {
        super.expire(RedisKeyUtils.getHashKey(className, key), seconds);
    }

    /**
     * 删除hash类型字段缓存
     *
     * @param clazz  实体类名称
     * @param fields field
     */
    @Override
    public void remove(Class<?> clazz, String key, Object... fields) {
        super.hDel(RedisKeyUtils.getHashKey(clazz, key), fields);
    }

    /**
     * 删除hash类型字段缓存
     *
     * @param className 自定义缓存名称
     * @param fields    field
     */
    @Override
    public void remove(String className, String key, Object... fields) {
        super.hDel(RedisKeyUtils.getHashKey(className, key), fields);
    }

    /**
     * 删除hash类型缓存
     *
     * @param clazz 实体类名称
     */
    @Override
    public void remove(Class<?> clazz, String key) {
        super.del(RedisKeyUtils.getHashKey(clazz, key));
    }

    /**
     * 删除hash类型缓存
     *
     * @param className 自定义缓存名称
     */
    @Override
    public void remove(String className, String key) {
        super.del(RedisKeyUtils.getHashKey(className, key));
    }

    /**
     * 获取hash类型所有的key
     *
     * @param className 自定义缓存名称
     */
    @Override
    public Set<String> keys(String className, String key) {
        return super.hKeys(RedisKeyUtils.getHashKey(className, key));
    }

    /**
     * 获取hash类型所有的key
     *
     * @param clazz 类名
     * @param key   key
     * @return java.util.Set<String>
     */
    @Override
    public Set<String> keys(Class<?> clazz, String key) {
        return super.hKeys(RedisKeyUtils.getHashKey(clazz, key));
    }

    /**
     * 获取hash类型所有的value
     *
     * @param className 自定义缓存名称
     */
    @Override
    public List<Object> values(String className, String key) {
        return super.hValues(RedisKeyUtils.getHashKey(className, key));
    }

    /**
     * 获取hash类型所有的value
     *
     * @param clazz 类名
     * @param key   key
     * @return java.util.List<Object>
     */
    @Override
    public List<Object> values(Class<?> clazz, String key) {
        return super.hValues(RedisKeyUtils.getHashKey(clazz, key));
    }

    /**
     * 获取map的长度
     *
     * @param className 类名
     * @param key       key
     * @return java.lang.Long
     */
    @Override
    public Long size(String className, String key) {
        return super.size(RedisKeyUtils.getHashKey(className, key));
    }

    /**
     * 获取map的长度
     *
     * @param clazz 类名
     * @param key   key
     * @return java.lang.Long
     */
    @Override
    public Long size(Class<?> clazz, String key) {
        return super.size(RedisKeyUtils.getHashKey(clazz, key));
    }

    /**
     * 是否存在key
     *
     * @param className 类名
     * @param key       key
     * @return java.lang.Boolean
     */
    @Override
    public Boolean hasKey(String className, String key) {
        return super.hasKey(RedisKeyUtils.getHashKey(className, key));
    }

    /**
     * 是否存在key
     *
     * @param clazz 类名
     * @param key   key
     * @return java.lang.Boolean
     */
    @Override
    public Boolean hasKey(Class<?> clazz, String key) {
        return super.hasKey(RedisKeyUtils.getHashKey(clazz, key));
    }

    /**
     * 是否存在key对应的key
     *
     * @param className 类名
     * @param key       key
     * @param item      item
     * @return java.lang.Boolean
     */
    @Override
    public Boolean hasKeyItem(String className, String key, String item) {
        return super.hHasKey(RedisKeyUtils.getHashKey(className, key), item);
    }

    /**
     * 是否存在key对应的key
     *
     * @param clazz 类名
     * @param key   key
     * @param item  item
     * @return java.lang.Boolean
     */
    @Override
    public Boolean hasKeyItem(Class<?> clazz, String key, String item) {
        return super.hHasKey(RedisKeyUtils.getHashKey(clazz, key), item);
    }

}
